#include "j_gui_lib.hpp"
#include "displayinfo.hpp"
#include <X11/X.h>
#include <X11/Xlib.h>
#include <cstddef>
#include <cstdint>
#include <iostream>
#include <ncurses.h>
#include <string>
#include "constants.hpp"
#include "remotecontrol.hpp"
#include "point.hpp"

// just::j_gui::j_gui(int argc, char** argv, i_remoteControll* remote):
//     m_argc(argc), m_argv(argv), current_state(0, 0, nullptr), m_remote(remote)
// {
//     if((my_display = XOpenDisplay(NULL)) == NULL)
//     {
//         std::cout<<"Не удалось подключится к дисплей серверу."<<std::endl;
//         exit(1);
//     }
    
//     root_window = XDefaultRootWindow(my_display);
//     my_screen = XDefaultScreen(my_display);
//     my_hints.flags = PMaxSize | PMinSize;
//     my_hints.max_width = 600;
//     my_hints.max_height = 500;
//     my_hints.min_width = 600;
//     my_hints.min_height = 500;
//     my_depth = DefaultDepth(my_display, my_screen);
//     my_attr.background_pixel = WhitePixel(my_display, my_screen);
//     my_attr.border_pixel = BlackPixel(my_display, my_screen);
//     my_attr.win_gravity = NorthWestGravity;
//     my_attr.override_redirect = True;
//     my_visual = XDefaultVisual(my_display, my_screen);

//     my_window = XCreateWindow(
//             my_display, 
//             root_window, 
//             100, 100, 900, 900, 0, 
//             my_depth, 
//             InputOutput, 
//             my_visual, 
//             CWBackPixel, 
//             &my_attr);

//     game_window = XCreateWindow(
//             my_display, 
//             my_window, 
//             game_window_x, 
//             game_window_y,
//             game_window_weight, 
//             game_window_height, 1, 
//             my_depth, 
//             InputOutput, 
//             my_visual, 
//             CWBackPixel | CWBorderPixel | CWWinGravity, &my_attr);
    
//     tool_window = XCreateWindow(
//             my_display, 
//             my_window, 
//             tool_window_x, 
//             tool_window_y, 
//             tool_window_weight, 
//             tool_window_height, 1, 
//             my_depth, 
//             InputOutput, 
//             my_visual, 
//             CWBackPixel | CWBorderPixel | CWWinGravity, &my_attr);

//     my_attr.background_pixel = BlackPixel(my_display, my_screen);

//     gc_values.background = BlackPixel(my_display, my_screen);
//     gc_values.foreground = BlackPixel(my_display, my_screen);
//     gc_values.line_width = 1;
//     gc = XCreateGC(my_display, my_window, GCBackground | GCForeground | GCLineWidth , &gc_values);

//     XStoreName(my_display,my_window,"Conway's Game of Life");
//     XSetIconName(my_display,my_window,"example");
//     XSetWMNormalHints(my_display, my_window, &my_hints);

//     XMapWindow(my_display, my_window);
//     XMapSubwindows(my_display, my_window);
//     XMapSubwindows(my_display, game_window);
//     XMapSubwindows(my_display, tool_window);

//     XSetCommand(my_display, my_window, m_argv, m_argc);
//     XSelectInput(
//             my_display, 
//             my_window, 
//             StructureNotifyMask | 
//             ExposureMask | 
//             ButtonReleaseMask |  
//             ButtonPressMask);

//     current_state = m_remote->get_display_info();   
//     display(current_state);

//     XFlush(my_display);
    
//     XEvent event;
//     while(1)
//     {
//         XNextEvent(my_display, &event); 
//         if(event.type == MapNotify)
//         {
//             break;
//         }
//     }
// }

// just::j_gui::~j_gui()
// {
//     XFreeGC(my_display, gc);
//     XDestroyWindow(my_display, my_window);
//     XCloseDisplay(my_display);   
// }

// void just::j_gui::display(display_info display_info)
// {
//     XClearWindow(my_display, game_window);

//     for (int x = 10; x < game_window_weight; x += 10) 
//     {
//         XDrawLine(my_display, game_window, gc, x, 0, x, game_window_height);
//     }

//     for (int y = 10; y<game_window_weight; y += 10) 
//     {
//         XDrawLine(my_display, game_window, gc, 0, y, game_window_weight, y);
//     }
    
//     for(int y = 0; y < display_info.m_y_higth; ++y)
//     {
//         for(int x = 0; x < display_info.m_x_width; ++x)
//         {
//             if(display_info.m_game_field[y][x] != 0)
//             {
//                 XFillRectangle(my_display, game_window, gc, x*10, y*10, 10, 10);
//             }
//         }
//     }
//     XFlush(my_display);
// }

// int just::j_gui::run()
// {
//     XEvent event;
//     XNextEvent(my_display, &event); 

//     switch (event.type) 
//     {
//         case Expose:
//             if(event.xexpose.count != 0)
//             {
//                 break;
//             }
//             if(current_state.m_game_field != nullptr)
//             {
//                 display(current_state);
//             }
//             break;

//         case ButtonPress:
//             m_remote->next_step();         
//             current_state = m_remote->get_display_info();         
//             break;
//     }

//     display(current_state);

//     return 0;
// }


// namespace just 
// {
//     j_button::j_button()
//     {

//     }

//     j_button::~j_button()
//     {

//     }

//     void j_button::draw()
//     {

//     }

//     void j_button::update()
//     {
        
//     }

//     void j_applet::set_position(point position)
//     {
//         m_position = position;
//     }

//     point j_applet::get_position()
//     {
//         return m_position;
//     }


    
// }